#ifndef CLAVE_H_
#define CLAVE_H_

#include <string.h>
#include "Dato.h"
#include "Utilitaria.h"
#include "../Conf/Tamanios.h"
#include <stdio.h>

class Clave {
public:
	Clave();
	Clave(string campoClav, Dato* dat );
	Clave(string valor, unsigned int refRegistro);
	Clave(string valor, unsigned int refRegistro, unsigned int hijoDer);
	virtual ~Clave();

	// para hacer pruebas, lo hago publico
	//TODO hacerlo privado
	string valorClave;
private:
	string campoClave;

	Dato *pdato;
	unsigned int refRegistro;
	/*Referencia al nodo derecho del arbol (Claves mayores a la clave actual).*/
	unsigned int hijoDer;

public:

	string getClave();

	string getCampoClave();

	int getTamanioClave();

	void setClave(string nuevaClave);

	int Comparar(Clave *otraClave);

	bool operator < (Clave& clave);

	bool operator == (Clave& clave);

/**
 *
 *	El tamanio de la clave depende de si se va a insertar en un nodo interno o
 *	en un nodo hoja. Representa el tamaño que ocupa la misma en disco.
 *	Si hijoDer == 0, significa que la clave se va a insertar en un nodo hoja,
 *  por lo cual no se tendra en cuenta el tamaño de este atributo. En cualquier
 *  otro caso se considerará el tamaño del hijo derecho.
 *  El valor 0 hace referencia al nodo Raíz, pero ningún nodo puede tener como hijo
 *  al nodo raíz, por lo tanto utilizar este valor no presenta inconvenientes.
 */
	unsigned int getTamanioEnDisco();

	void desSerializar(string Dato);

	unsigned int getTamanioValorConPrefijo();

	unsigned int getTamanioValor();

	/*Devuelve una copia de la Clave*/
	Clave* copiar();

	unsigned int getReferencia()
	{
		return refRegistro;
	}

	void setReferencia(unsigned int referencia)
	{
		this->refRegistro = referencia;
	}

	void setHijoDer(unsigned int hijoDer)
	{
		this->hijoDer = hijoDer;
	}

	unsigned int getHijoDer()
	{
		return this->hijoDer;
	}

};



#endif /* CLAVE_H_ */
